package com.zjl.redis.第18章_五大数据类型和源码解析;

/**
 * @see com.zjl.redis.第02章_十大数据类型.B2_List
 *
 *  表示一个quicklist两端不被压缩的节点个数。这里的节点是指quicklist双向链表的节点，而不是指ziplist里面的数据项个数
 *   参数 list-compress-depth 的取值含义如下:
 *   0:是个特殊值，表示都不压缩。这是Redis的默认值。
 *   1:表示quicklist两端各有1个节点不压缩，中间的节点压缩。
 *   2:表示quicklist两端各有2个节点不压缩，中间的节点压缩。
 *   3:表示quicklist两端各有3个节点不压缩，中间的节点压缩。
 *   .....
 *
 *
 *   ziplist中entry配置: list-max-ziplist-size -2   redis7出现了 list-max-listpack-size -2
 *   当取正值的时候，表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如，当这个参数配置成5的时候，表示每个quicklist节点的
 *   ziplist最多包含5个数据项。当取负值的时候，表示按照占用字节数来限定每个quicklist节点上的ziplist长度。这时，它只能取-1到-5这五个值,
 *   每个值含义如下:
 *   -5:每个quicklist节点上的ziplist大小不能超过64 Kb。(注: 1kb => 1024 bytes)
 *   -4:每个quigklist节点上的ziplist大小不能超过32 Kb。
 *   -3:每个quicklist节点上的ziplist大小不能超过16 Kb.
 *   -2:每个quicklist节点上的ziplist大小不能超过8 Kb。 (-2是Redis给出的默认值)
 *   -1:每个quicklist节点上的ziplist大小不能超过4 Kb.
 *
 *  List的数据结构为块表quickList，实际上是 zipList 和 linkedList（双向链表） 的混合体，
 *  它将所有的元素紧挨着一起存储,分配的是一块连续的内存
 *      当数据量比较多的时候才会改成quicklist。
 *      因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只
 *      是int类型的数据,结构上还需要两个额外的指针prev和next。。
 *           ziplist <-> ziplist <-> ziplist <-> ziplist <-> ziplist
 *      Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指
 *      针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。。
 *
 * //c语言源码
 * typedef struct quicklist {
 *      quicklistNode *head;       指向双向列表的表头
 *      quicklistNode *tail;       指向双向列表的表尾
 *      unsigned long count;       所有的ziplist中一共存了多少个元素
 *      unsigned long len;         双向链表的长度，node的数量
 *      int fill : 16;             单个节点的填充因子
 *      unsigned int compress:16;  压缩深度，0:不压缩;
 * } quicklist
 *
 * 而redis 7
 * 就是把 zipList 改为了 listpack
 * @see B3_压缩列表ziplist
 * @see B8_紧凑列表listpack
 *
 *
 */
public class B7_快速列表quicklist {

}
